home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / 3dvect39 / fade.asm < prev    next >
Encoding:
Assembly Source File  |  1994-10-30  |  14.9 KB  |  443 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. ;
  3. ; Filename     : More.inc
  4. ; Included from: Main assembley module
  5. ; Description  : Irq palette fading routines
  6. ;
  7. ; Written by: John McCarthy
  8. ;             1316 Redwood Lane
  9. ;             Pickering, Ontario.
  10. ;             Canada, Earth, Milky Way (for those out-of-towners)
  11. ;             L1X 1C5
  12. ;
  13. ; Internet/Usenet:  BRIAN.MCCARTHY@CANREM.COM
  14. ;         Fidonet:  Brian McCarthy 1:229/15
  15. ;   RIME/Relaynet: ->CRS
  16. ;
  17. ; Home phone, (905) 831-1944, don't call at 2 am eh!
  18. ;
  19. ; John Mccarthy would really love to work for a company programming Robots
  20. ; or doing some high intensive CPU work.  Hint. Hint.
  21. ;
  22. ; Send me your protected mode source code!
  23. ; Send me your Objects!
  24. ; But most of all, Send me a postcard!!!!
  25. ;
  26. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  27.  
  28.          .386p
  29.          jumps
  30.  
  31. code32   segment para public use32
  32.          assume cs:code32, ds:code32
  33.  
  34. ; define externals
  35.  
  36.          include pmode.ext                  ; protected mode externals
  37.          include irq.ext
  38.          include macros.inc
  39.          include equ.inc
  40.  
  41.          public _slidebytes                 ; TRAN's slide byte routine
  42.          public _slidewords                 ; slide word routine
  43.          public _fade_all                   ; fade palette to a common colour
  44.          public _fade_palette               ; fade from esi to edi
  45.          public _palette1                   ; temp storage palettes (768 bytes each)
  46.          public _palette2
  47.          public _sourcepal
  48.          public _destpal
  49.          public _fadestep
  50.          public _fadestatus
  51.          public _fade_palette_read          ; fade from current palette to pal at ESI
  52.          public _wait_for_fade              ; wait for irq fade to complete
  53.          public _get_palette                ; get palette from video card
  54.          public _put_palette                ; put palette to video card
  55.          public _default_palette            ; palette for DOS
  56.          public _stop_fade
  57.  
  58. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  59. ; Slide a block of bytes closer to another block in value
  60. ; In:
  61. ;   BL - max value to slide by (usually 1)
  62. ;   ECX - number of bytes to slide
  63. ;   ESI - block to slide towards
  64. ;   EDI - block to slide
  65. ; Out:
  66. ;   CF=1 - no changes made
  67. ;   CF=0 - at least one change made
  68. ; Notes: Routine courtesy of TRAN from HELL.EXE
  69. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  70.  
  71. _slidebytes:
  72.          pushad
  73.          xor bh,bh
  74. slidebytesml:
  75.          mov al,[edi]
  76.          mov ah,[esi]
  77.          cmp al,ah
  78.          je short slidebytesmlc
  79.          mov bh,1
  80.          jb short slidebytesmlf0
  81.          sub ah,al
  82.          neg ah
  83.          cmp ah,bl
  84.          jbe short slidebytesmlf2
  85.          mov ah,bl
  86. slidebytesmlf2:
  87.          neg ah
  88.          jmp short slidebytesmlf1
  89. slidebytesmlf0:
  90.          sub ah,al
  91.          cmp ah,bl
  92.          jbe short slidebytesmlf1
  93.          mov ah,bl
  94. slidebytesmlf1:
  95.          add al,ah
  96.          mov [edi],al
  97. slidebytesmlc:
  98.          inc edi
  99.          inc esi
  100.          loop slidebytesml
  101.          sub bh,1
  102.          popad
  103.          ret
  104.  
  105. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  106. ; Slide a block of words closer to another block in value
  107. ; In:
  108. ;   BX - max value to slide by (1 = really slow slide)
  109. ;   ECX - number of words to slide
  110. ;   ESI - block to slide towards
  111. ;   EDI - block to slide
  112. ; Out:
  113. ;   CF=1 - no changes made
  114. ;   CF=0 - at least one change made
  115. ; Notes: Idea courtesy of TRAN from _slidebytes
  116. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  117.  
  118. _slidewords:
  119.          pushad
  120.          xor dh,dh
  121. slidewordsml:
  122.          mov ax,[edi]
  123.          mov bp,[esi]
  124.          cmp ax,bp
  125.          je short slidewordsmlc
  126.          mov dh,1
  127.          jb short slidewordsmlf0
  128.          sub bp,ax
  129.          neg bp
  130.          cmp bp,bx
  131.          jbe short slidewordsmlf2
  132.          mov bp,bx
  133. slidewordsmlf2:
  134.          neg bp
  135.          jmp short slidewordsmlf1
  136. slidewordsmlf0:
  137.          sub bp,ax
  138.          cmp bp,bx
  139.          jbe short slidewordsmlf1
  140.          mov bp,bx
  141. slidewordsmlf1:
  142.          add ax,bp
  143.          mov [edi],ax
  144. slidewordsmlc:
  145.          add edi,2
  146.          add esi,2
  147.          loop slidewordsml
  148.          sub dh,1
  149.          popad
  150.          ret
  151.  
  152. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  153. ; Data for IRQ controlled palette fading routines
  154. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  155.  
  156. number_of_colours equ 256
  157.  
  158. _palette1 db number_of_colours*3 dup (0)
  159. _palette2 db number_of_colours*3 dup (0)
  160. _sourcepal  dd 0
  161. _destpal    dd 0
  162. _fadestep   dd 0
  163. _fadestatus db 0
  164. fadecount   db 0
  165. irqnum      dd -1
  166.  
  167. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  168. ; _Fade_palette_read: IRQ Fade from current palette to new palette at ESI
  169. ; In:
  170. ;  ESI = palette to fade to
  171. ;   BH - how much to fade each pel        (usually 1)
  172. ;   BL - how often should fade be applied (255 = every IRQ)
  173. ; Out: null
  174. ; Notes: takes control of _irqcontrol2
  175. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  176.  
  177. _fade_palette_read:
  178.          call _stop_fade
  179.          mov _fadestep,ebx
  180.  
  181.          mov edi,offset _palette2           ; get current palette from card (yeah, i know its slow)
  182.          mov ecx,number_of_colours*3
  183.          xor al,al
  184.          call _get_palette
  185.  
  186.          mov edi,offset _palette2
  187.          jmp _fade_palette
  188.  
  189. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  190. ; _Fade_all: IRQ Fade palette to a common single colour
  191. ; In:
  192. ;  EAX = colour to fade to (xx,rd,gr,bl)
  193. ;   BH - how much to fade each pel
  194. ;   BL - how often should fade be applied (1 = very slow)
  195. ; Out: null
  196. ; Notes: takes control of _irqcontrol2
  197. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  198.  
  199. _fade_all:
  200.          call _stop_fade
  201.          mov _fadestep,ebx
  202.          mov ecx,number_of_colours
  203.          mov edi,offset _palette1
  204.          mov bl,al
  205.          shr eax,8
  206. fd_lp:
  207.          mov [edi+0],ah
  208.          mov [edi+1],al
  209.          mov [edi+2],bl
  210.          add edi,3
  211.          loop fd_lp
  212.  
  213.          mov edi,offset _palette2           ; get current palette from card (yeah, i know its slow)
  214.          mov ecx,number_of_colours*3
  215.          xor al,al
  216.          call _get_palette
  217.  
  218.          mov esi,offset _palette1
  219.          mov edi,offset _palette2
  220.          mov ebx,_fadestep
  221.  
  222. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  223. ; _Fade_palette: Fade palette from palette ESI to palette EDI
  224. ; In:
  225. ;  ESI - palette to fade to
  226. ;  EDI - palette to fade from
  227. ;   BH - how much to fade each pel
  228. ;   BL - how often should fade be applied (255 = every IRQ)
  229. ; Out: null
  230. ; Notes: takes control of _irqcontrol2
  231. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  232.  
  233. _fade_palette:
  234.          pushad
  235.          call _stop_fade
  236.  
  237.          mov _destpal,edi
  238.          mov edi,offset _palette1           ; copy palette to modify into buffer
  239.          mov _sourcepal,edi
  240.          mov _fadestep,ebx
  241.  
  242.          mov ecx,number_of_colours*3
  243.          rep movsb
  244.  
  245.          mov fadecount,0
  246.          mov _fadestatus,-1
  247.          call _irq_findcontrol
  248.          mov irqnum,ecx
  249.          mov _irqcontrol[ecx*4],offset irqfade
  250.          popad
  251.          ret
  252.  
  253. irqfade:
  254.          mov al,b _fadestep
  255.          add fadecount,al
  256.          jnc no_changeyet
  257.  
  258.          mov esi,_sourcepal
  259.          mov edi,_destpal
  260.          mov bl,b _fadestep+1
  261.          mov ecx,number_of_colours*3
  262.          call _slidebytes
  263.          jc no_more_fade
  264.  
  265.          cld
  266.          mov edx,dac_write_addr
  267.          xor al,al
  268.          out dx,al
  269.          mov esi,_destpal
  270.          inc edx
  271.          mov ecx,number_of_colours*3
  272.          rep outsb
  273.          ret
  274.  
  275. no_more_fade:
  276.          call _stop_fade
  277.          mov _fadestatus,0
  278. no_changeyet:
  279.          ret
  280.  
  281. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  282. ; Wait for fade to complete
  283. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  284.  
  285. _wait_for_fade:
  286.          test _fadestatus,-1                ; wait until fade is complete
  287.          jnz _wait_for_fade
  288.          ret
  289.  
  290. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  291. ; _GetPal - get current palette from video card
  292. ; In:
  293. ;   EDI - destination location
  294. ;    AL - start pel
  295. ;   ECX - number of pels to get (max 768)
  296. ; Out: ?
  297. ; Notes: Listen, I know this routine is duplicated in xmode.asm but I hate
  298. ;        stack frames.
  299. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  300.  
  301. _get_palette:
  302.          pushad
  303.          mov edx, dac_read_addr             ; read block of pals
  304.          out dx, al
  305.          mov edx, pel_data_reg
  306.  
  307.          rep insb                           ; block read dac registers
  308.          popad
  309.          ret
  310.  
  311. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  312. ; _PutPal - put new palette to video card
  313. ; In:
  314. ;   ESI - destination location
  315. ;    AL - start pel
  316. ;   ECX - number of pels to write (max 768)
  317. ; Out: ?
  318. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  319.  
  320. _put_palette:
  321.          pushad
  322.          mov edx, dac_write_addr
  323.          out dx, al
  324.          mov edx, pel_data_reg
  325.          rep outsb
  326.          popad
  327.          ret
  328.  
  329. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  330. ; Stop fading
  331. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  332.  
  333. _stop_fade:
  334.          cmp irqnum,-1
  335.          je _ret
  336.          push ecx
  337.          mov ecx,irqnum
  338.          mov _irqcontrol[ecx*4],offset _ret
  339.          mov irqnum,-1
  340.          pop ecx
  341.          ret
  342.  
  343. _default_palette label byte
  344.          db 000h,000h,000h,000h,000h,02Ah,000h,02Ah
  345.          db 000h,000h,02Ah,02Ah,02Ah,000h,000h,02Ah
  346.          db 000h,02Ah,02Ah,02Ah,000h,02Ah,02Ah,02Ah
  347.          db 000h,000h,015h,000h,000h,03Fh,000h,02Ah
  348.          db 015h,000h,02Ah,03Fh,02Ah,000h,015h,02Ah
  349.          db 000h,03Fh,02Ah,02Ah,015h,02Ah,02Ah,03Fh
  350.          db 000h,015h,000h,000h,015h,02Ah,000h,03Fh
  351.          db 000h,000h,03Fh,02Ah,02Ah,015h,000h,02Ah
  352.          db 015h,02Ah,02Ah,03Fh,000h,02Ah,03Fh,02Ah
  353.          db 000h,015h,015h,000h,015h,03Fh,000h,03Fh
  354.          db 015h,000h,03Fh,03Fh,02Ah,015h,015h,02Ah
  355.          db 015h,03Fh,02Ah,03Fh,015h,02Ah,03Fh,03Fh
  356.          db 015h,000h,000h,015h,000h,02Ah,015h,02Ah
  357.          db 000h,015h,02Ah,02Ah,03Fh,000h,000h,03Fh
  358.          db 000h,02Ah,03Fh,02Ah,000h,03Fh,02Ah,02Ah
  359.          db 015h,000h,015h,015h,000h,03Fh,015h,02Ah
  360.          db 015h,015h,02Ah,03Fh,03Fh,000h,015h,03Fh
  361.          db 000h,03Fh,03Fh,02Ah,015h,03Fh,02Ah,03Fh
  362.          db 015h,015h,000h,015h,015h,02Ah,015h,03Fh
  363.          db 000h,015h,03Fh,02Ah,03Fh,015h,000h,03Fh
  364.          db 015h,02Ah,03Fh,03Fh,000h,03Fh,03Fh,02Ah
  365.          db 015h,015h,015h,015h,015h,03Fh,015h,03Fh
  366.          db 015h,015h,03Fh,03Fh,03Fh,015h,015h,03Fh
  367.          db 015h,03Fh,03Fh,03Fh,015h,03Fh,03Fh,03Fh
  368.          db 000h,026h,010h,012h,003h,015h,018h,000h
  369.          db 000h,000h,00Ah,002h,026h,025h,00Fh,000h
  370.          db 001h,02Ah,004h,026h,009h,015h,030h,000h
  371.          db 000h,000h,026h,023h,020h,000h,000h,000h
  372.          db 006h,005h,029h,000h,000h,000h,009h,030h
  373.          db 021h,00Dh,033h,01Ah,026h,018h,003h,030h
  374.          db 031h,032h,033h,034h,035h,036h,037h,038h
  375.          db 039h,001h,002h,003h,004h,005h,006h,010h
  376.          db 013h,011h,012h,017h,03Bh,001h,028h,001h
  377.          db 000h,00Bh,010h,039h,008h,000h,000h,000h
  378.          db 034h,00Fh,001h,002h,004h,00Ah,002h,024h
  379.          db 00Fh,017h,026h,02Bh,022h,034h,01Fh,01Ah
  380.          db 019h,01Bh,018h,003h,03Fh,000h,000h,00Ah
  381.          db 000h,02Bh,03Dh,018h,000h,000h,000h,039h
  382.          db 000h,00Eh,000h,000h,033h,000h,033h,02Bh
  383.          db 003h,013h,025h,02Eh,024h,020h,02Dh,025h
  384.          db 020h,021h,020h,030h,02Fh,033h,034h,023h
  385.          db 021h,032h,024h,021h,00Dh,00Ah,00Dh,00Ah
  386.          db 00Ah,02Fh,028h,02Eh,020h,00Dh,023h,003h
  387.          db 021h,032h,034h,028h,039h,020h,034h,032h
  388.          db 029h,025h,033h,020h,034h,02Fh,020h,022h
  389.          db 025h,020h,021h,020h,032h,025h,027h,035h
  390.          db 02Ch,021h,032h,020h,02Fh,02Eh,020h,004h
  391.          db 029h,027h,029h,034h,021h,02Ch,020h,010h
  392.          db 029h,038h,025h,02Ch,03Ah,020h,028h,034h
  393.          db 031h,036h,029h,020h,032h,039h,038h,02Dh
  394.          db 031h,034h,038h,037h,00Dh,00Ah,020h,020h
  395.          db 020h,020h,020h,020h,020h,020h,020h,020h
  396.          db 020h,020h,020h,020h,020h,020h,020h,020h
  397.          db 020h,020h,020h,020h,020h,020h,020h,020h
  398.          db 020h,021h,02Eh,024h,020h,02Fh,02Eh,020h
  399.          db 034h,028h,025h,020h,014h,02Fh,032h,02Fh
  400.          db 02Eh,034h,02Fh,020h,016h,012h,020h,013h
  401.          db 009h,007h,03Ah,020h,028h,034h,031h,036h
  402.          db 029h,020h,036h,033h,031h,02Dh,036h,036h
  403.          db 032h,035h,00Dh,00Ah,00Dh,00Ah,00Fh,032h
  404.          db 020h,037h,032h,029h,034h,025h,020h,034h
  405.          db 02Fh,020h,034h,028h,029h,033h,020h,021h
  406.          db 024h,024h,032h,025h,033h,033h,03Ah,00Dh
  407.          db 00Ah,00Dh,00Ah,020h,020h,020h,020h,00Ah
  408.          db 02Fh,028h,02Eh,020h,00Dh,023h,003h,021h
  409.          db 032h,034h,028h,039h,00Dh,00Ah,020h,020h
  410.          db 020h,020h,031h,033h,031h,036h,020h,012h
  411.          db 025h,024h,037h,02Fh,02Fh,024h,020h,00Ch
  412.          db 021h,02Eh,025h,00Dh,00Ah,020h,020h,020h
  413.          db 020h,010h,029h,023h,02Bh,025h,032h,029h
  414.          db 02Eh,027h,02Ch,020h,00Fh,02Eh,034h,021h
  415.          db 032h,029h,02Fh,02Eh,00Dh,00Ah,020h,020h
  416.          db 020h,020h,003h,021h,02Eh,021h,024h,021h
  417.          db 02Ch,020h,005h,021h,032h,034h,028h,02Ch
  418.          db 020h,00Dh,029h,02Ch,02Bh,039h,020h,017h
  419.          db 021h,039h,02Eh,020h,020h,028h,026h,02Fh
  420.          db 032h,020h,034h,028h,02Fh,033h,025h,020h
  421.          db 02Fh,035h,034h,02Dh,02Fh,026h,02Dh,034h
  422.          db 02Fh,037h,02Eh,025h,032h,033h,029h,00Dh
  423.          db 00Ah,020h,020h,020h,020h,00Ch,031h,018h
  424.          db 020h,031h,003h,035h,00Dh,00Ah,024h,03Eh
  425.          db 000h,000h,000h,000h,03Fh,001h,00Fh,001h
  426.          db 030h,000h,039h,003h,000h,003h,000h,03Ch
  427.          db 001h,00Ch,001h,030h,000h,01Ch,000h,03Ch
  428.          db 00Eh,000h,004h,000h,031h,001h,037h,001h
  429.          db 030h,000h,03Dh,010h,000h,006h,000h,02Fh
  430.          db 001h,035h,001h,000h,000h,000h,03Fh,023h
  431.          db 000h,00Dh,000h,00Eh,033h,004h,020h,016h
  432.          db 025h,023h,034h,02Fh,032h,033h,020h,029h
  433.          db 02Eh,020h,033h,032h,030h,038h,034h,030h
  434.          db 030h,020h,00Dh,02Fh,024h,025h,02Dh,018h
  435.          db 03Bh,03Fh,00Fh,000h,030h,001h,00Eh,016h
  436.          db 025h,023h,034h,02Fh,032h,020h,012h,02Fh
  437.          db 035h,034h,029h,02Eh,025h,033h,020h,022h
  438.          db 039h,020h,00Ah,02Fh,028h,02Eh,020h,00Dh
  439.          db 023h,003h,021h,032h,034h,028h,039h,03Fh
  440.  
  441. code32   ends
  442.          end
  443.